﻿using System.Linq;
using Caliburn.Micro;
using WPCloudPT.Eventos;
using WPCloudPT.Model;
using WPCloudPT.Utils;

namespace WPCloudPT.ViewModels
{
    public class ConteudoViewModel : Screen, IHandle<EventoUtilizador>
    {
        #region ClassVars

        private static readonly Utilities TmpUtils = Utilities.GetInstance();
        #endregion

        #region Properties

        private BindableCollection<InformacaoPastas> _dadosPastas;
        private string _infoTitulo;
        private InformacaoPastas _selectedDadosPastas;
        private string _pesquisaconteudo;
        private bool _isPesquisaActiva;
        private BindableCollection<InformacaoPastas> _resultadosPesquisa;
        private bool _canMudaConteudo;
        private bool _canPesquisaConteudo;
        private bool _canInformacao;


        public bool CanMudaConteudo
        {
            get { return _canMudaConteudo; }
            set
            {
                _canMudaConteudo = value;
                NotifyOfPropertyChange(() => CanMudaConteudo);
            }
        }


        public bool CanPesquisaConteudo
        {
            get { return _canPesquisaConteudo; }
            set
            {
                _canPesquisaConteudo = value;
                NotifyOfPropertyChange(() => CanPesquisaConteudo);
            }
        }

        public bool CanInformacao
        {
            get { return _canInformacao; }
            set
            {
                _canInformacao = value;
                NotifyOfPropertyChange(() => CanInformacao);
            }
        }
        public BindableCollection<InformacaoPastas> ResultadosPesquisa
        {
            get { return _resultadosPesquisa; }
            set
            {
                _resultadosPesquisa = value;
                NotifyOfPropertyChange(() => ResultadosPesquisa);
            }
        }

        public bool IsPesquisaActiva
        {
            get { return _isPesquisaActiva; }
            set
            {
                _isPesquisaActiva = value;
                NotifyOfPropertyChange(() => IsPesquisaActiva);
            }
        }


        public string SearchConteudo
        {
            get { return _pesquisaconteudo; }
            set
            {
                _pesquisaconteudo = value;
                NotifyOfPropertyChange(() => SearchConteudo);
            }
        }


        public BindableCollection<InformacaoPastas> DadosPastas
        {
            get { return _dadosPastas; }
            set
            {
                _dadosPastas = value;
                NotifyOfPropertyChange(() => DadosPastas);
            }
        }

        public InformacaoPastas SelectedDadosPastas
        {
            get { return _selectedDadosPastas; }
            set
            {
                _selectedDadosPastas = value;
                CanInformacao = true;
                NotifyOfPropertyChange(() => SelectedDadosPastas);

            }
        }


        public string InfoTitulo
        {
            get { return _infoTitulo; }
            set
            {
                _infoTitulo = value;
                NotifyOfPropertyChange(() => InfoTitulo);
            }
        }

        #endregion

        #region Ctor
        //public ConteudoViewModel(INavigationService value, IWindowManager valuewindowManager,
        //                         Func<MessageViewModel> valuemessageViewModelFactory)
        //{
        //    DisplayName = "Conteudo";

        //    _windowManager = valuewindowManager;
        //    _messageViewModelFactory = valuemessageViewModelFactory;
        //}
        #endregion
        #region Metodos

        /// <summary>
        /// metodos da framework
        /// </summary>
        protected override void OnActivate()
        {
            base.OnActivate();
            InfoTitulo = "Conteudo";
            EventAggregationProvider.Aggregator.Subscribe(this);
            if(TmpUtils.TmpDadosPastas!=null)
            {
                DadosPastas = TmpUtils.TmpDadosPastas;
            }
            else
            {
                TmpUtils.DevolveListaFicheiro();    
            }
            
        }

        protected override void OnViewLoaded(object view)
        {
            base.OnViewLoaded(view);
            CanInformacao = false;
        }
        protected override void OnDeactivate(bool close)
        {
            base.OnDeactivate(close);
            EventAggregationProvider.Aggregator.Unsubscribe(this);
        }

        public void SetSelectedItem(object value)
        {
            if (value == null) return;
            SelectedDadosPastas = value as InformacaoPastas;
        }


        public void MudaConteudo()
        {
        }

        public void PesquisaConteudo()
        {
            if (SearchConteudo.Length < 3)
            {

                return;
            }
            if (DadosPastas != null)
            {
                PesquisaLocal();
            }
            else
            {
                TmpUtils.PesquisaConteudo(SearchConteudo);
            }


        }

        private void PesquisaLocal()
        {
            var tmp = (from t in DadosPastas
                       where t.Path.Contains(SearchConteudo)
                       select t).ToList();


            if (tmp.Any()) return;
            IsPesquisaActiva = true;
            if (ResultadosPesquisa.Any())
            {
                ResultadosPesquisa.Clear();
                ResultadosPesquisa = new BindableCollection<InformacaoPastas>(tmp);
            }
            else
            {
                ResultadosPesquisa = new BindableCollection<InformacaoPastas>(tmp);
            }
            CanInformacao = true;
        }

       


        public void Informacao()
        {

        }

        #endregion

        #region IHandle<EventoUtilizador> Members

        /// <summary>
        /// Handles the message.
        /// </summary>
        /// <param name="message">The message.</param>
        public void Handle(EventoUtilizador message)
        {
            if (message.EventoTipo == TipoEventoUtilizador.ConteudoUserOk)
            {
                DadosPastas = TmpUtils.TmpDadosPastas;
            }
        }

        #endregion
    }
}